{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "tensorflow_homework.ipynb",
      "provenance": [],
      "collapsed_sections": [],
      "include_colab_link": true
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    }
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "view-in-github",
        "colab_type": "text"
      },
      "source": [
        "<a href=\"https://colab.research.google.com/github/henrygas/tensorflow_2_learn/blob/master/tensorflow_homework.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "McIdLuwemOss",
        "colab_type": "code",
        "outputId": "73db3980-21bd-415b-f8ed-d90c8c87525b",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 35
        }
      },
      "source": [
        "%tensorflow_version 1.x\n",
        "\n",
        "import numpy as np\n",
        "import tensorflow as tf\n",
        "from tensorflow.examples.tutorials.mnist import input_data\n",
        "from matplotlib import pyplot as plt\n",
        "%matplotlib inline\n",
        "\n",
        "tf.logging.set_verbosity(tf.logging.INFO)\n",
        "print(tf.__version__)"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "1.15.0-rc3\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "G4TNLEJEsK3v",
        "colab_type": "code",
        "outputId": "150558e5-9c86-4ab3-cdbd-8354b629bf16",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 613
        }
      },
      "source": [
        "mnist = input_data.read_data_sets(\"./\")\n",
        "\n",
        "print(mnist.train.images.shape)\n",
        "print(mnist.train.labels.shape)\n",
        "\n",
        "print(mnist.validation.images.shape)\n",
        "print(mnist.validation.labels.shape)\n",
        "\n",
        "print(mnist.test.images.shape)\n",
        "print(mnist.test.labels.shape)"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "WARNING:tensorflow:From <ipython-input-2-b0ffac263758>:1: read_data_sets (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
            "Instructions for updating:\n",
            "Please use alternatives such as official/mnist/dataset.py from tensorflow/models.\n",
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow_core/contrib/learn/python/learn/datasets/mnist.py:260: maybe_download (from tensorflow.contrib.learn.python.learn.datasets.base) is deprecated and will be removed in a future version.\n",
            "Instructions for updating:\n",
            "Please write your own downloading logic.\n",
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow_core/contrib/learn/python/learn/datasets/base.py:252: _internal_retry.<locals>.wrap.<locals>.wrapped_fn (from tensorflow.contrib.learn.python.learn.datasets.base) is deprecated and will be removed in a future version.\n",
            "Instructions for updating:\n",
            "Please use urllib or similar directly.\n",
            "Successfully downloaded train-images-idx3-ubyte.gz 9912422 bytes.\n",
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow_core/contrib/learn/python/learn/datasets/mnist.py:262: extract_images (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
            "Instructions for updating:\n",
            "Please use tf.data to implement this functionality.\n",
            "Extracting ./train-images-idx3-ubyte.gz\n",
            "Successfully downloaded train-labels-idx1-ubyte.gz 28881 bytes.\n",
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow_core/contrib/learn/python/learn/datasets/mnist.py:267: extract_labels (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
            "Instructions for updating:\n",
            "Please use tf.data to implement this functionality.\n",
            "Extracting ./train-labels-idx1-ubyte.gz\n",
            "Successfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes.\n",
            "Extracting ./t10k-images-idx3-ubyte.gz\n",
            "Successfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes.\n",
            "Extracting ./t10k-labels-idx1-ubyte.gz\n",
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow_core/contrib/learn/python/learn/datasets/mnist.py:290: DataSet.__init__ (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
            "Instructions for updating:\n",
            "Please use alternatives such as official/mnist/dataset.py from tensorflow/models.\n",
            "(55000, 784)\n",
            "(55000,)\n",
            "(5000, 784)\n",
            "(5000,)\n",
            "(10000, 784)\n",
            "(10000,)\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "0Lw5xmFTsoiz",
        "colab_type": "text"
      },
      "source": [
        "可以看到images里面有数量不等的图片，每张图片是28$\\times$28长度的一维向量，所以用的时候需要将它转化为28$\\times$28的图片。labels中则是图片对应的数字的值。"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "XytdtkIosluW",
        "colab_type": "code",
        "outputId": "9e48426c-bbbd-4269-fda1-f50ef687112a",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 499
        }
      },
      "source": [
        "plt.figure(figsize=(8, 8))\n",
        "\n",
        "for idx in range(16):\n",
        "  plt.subplot(4, 4, idx + 1)\n",
        "  plt.axis(\"off\")\n",
        "  plt.title(\"[{}]\".format(mnist.train.labels[idx]))\n",
        "  plt.imshow(mnist.train.images[idx].reshape((28, 28)))"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 576x576 with 16 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "emIm67eHtf-T",
        "colab_type": "text"
      },
      "source": [
        "接下来，定义用于训练的网络，首先定义网络的输入。\n",
        "<br/><br/>\n",
        "这里我们直接使用上面的数据作为输入，所以定义两个placeholder分别用于图像和label数据，另外，定义一个float类型的变量用于设置学习率。\n",
        "<br/><br/>\n",
        "为了让网络更高效的运行，多个数据会被组织成一个batch送入网络，两个placeholder的第一个维度就是batchsize，因为我们这里还没有确定batchsize，所以第一个维度留空。"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "u-XV9iVXtaSE",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "x = tf.placeholder(\"float\", [None, 784])\n",
        "y = tf.placeholder(\"int64\", [None])\n",
        "learning_rate = tf.placeholder(\"float\")"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "ai5vbZ6Rua92",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "def initialize(shape, stddev=0.1):\n",
        "  \"\"\"\n",
        "  :param shape: 输入张量的维度形状\n",
        "  :param stddev: 标准差\n",
        "  :return 生成指定维度的张量，元素值满足正态分布 N(0, stddev), 且元素都在正负2 * stddev范围内\n",
        "  \"\"\"\n",
        "  return tf.truncated_normal(shape, stddev=0.1)\n",
        "\n",
        "L1_units_count = 100\n",
        "W_1 = tf.Variable(initialize([784, L1_units_count]))\n",
        "b_1 = tf.Variable(initialize([L1_units_count]))\n",
        "logits_1 = tf.matmul(x, W_1) + b_1\n",
        "output_1 = tf.nn.relu(logits_1)\n",
        "\n",
        "L2_units_count = 10\n",
        "W_2 = tf.Variable(initialize([L1_units_count, L2_units_count]))\n",
        "b_2 = tf.Variable(initialize([L2_units_count]))\n",
        "logits_2 = tf.matmul(output_1, W_2) + b_2\n",
        "\n",
        "logits = logits_2"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "z4qespT6qUHL",
        "colab_type": "text"
      },
      "source": [
        "接下来定义loss和用于优化网络的优化器。loss计算使用了sparse_softmax_cross_entropy_with_logits，这样做的好处是labels可以不用手动做one_hot省了一些麻烦。这里使用了sgd优化器，学习率为可以根据需要设定。\n",
        "<br/><br/>\n",
        "试试看，增大减小学习率，换个优化器再训练会发生什么。"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "bUVxR3XqqvMm",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "cross_entropy_loss = tf.reduce_mean(\n",
        "    tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=y)\n",
        ")\n",
        "\n",
        "optimizer = tf.train.GradientDescentOptimizer(\n",
        "    learning_rate=learning_rate).minimize(cross_entropy_loss)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "3OUC9maBrRGq",
        "colab_type": "text"
      },
      "source": [
        "需要注意的是，上面的网络，最后输出的是未经softmax的原始logits，而不是概率分布，要想看到概率分布，还需要做一下softmax.\n",
        "<br/><br/>\n",
        "将输出的结果与正确结果进行对比，即可得到我们的网络输出结果的准确率。"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "uoh-e_GGqtdM",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "pred = tf.nn.softmax(logits)\n",
        "correct_pred = tf.equal(tf.argmax(pred, 1), y)\n",
        "accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "rrNZE-qnsSTD",
        "colab_type": "text"
      },
      "source": [
        "saver用于保存或恢复训练的模型。"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "eOnHhG6SsZIR",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "batch_size = 32\n",
        "training_step = 1000\n",
        "\n",
        "saver = tf.train.Saver()"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "mdITD1plsgD1",
        "colab_type": "text"
      },
      "source": [
        "以上定义的所有操作，均为计算图Graph，也就是仅仅是定义了网络的结构，实际需要运行的话，还需要创建一个session，并将数据填入网络中。"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "UQ5ZTw8Osq6F",
        "colab_type": "code",
        "outputId": "78078f12-18f5-4ec6-b06d-394b283c0565",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 289
        }
      },
      "source": [
        "with tf.Session() as sess:\n",
        "  sess.run(tf.global_variables_initializer())\n",
        "\n",
        "  # 定义验证集与测试集\n",
        "  validate_data = {\n",
        "      x: mnist.validation.images,\n",
        "      y: mnist.validation.labels\n",
        "  }\n",
        "  test_data = {\n",
        "      x: mnist.test.images,\n",
        "      y: mnist.test.labels\n",
        "  }\n",
        "\n",
        "  for i in range(training_step):\n",
        "    xs, ys = mnist.train.next_batch(batch_size)\n",
        "    _, loss = sess.run(\n",
        "        [optimizer, cross_entropy_loss],\n",
        "        feed_dict = {\n",
        "            x: xs,\n",
        "            y: ys,\n",
        "            learning_rate: 0.3\n",
        "        }\n",
        "    )\n",
        "\n",
        "    # 每100次训练打印一次损失值与验证准确率\n",
        "    if i > 0 and i % 100 == 0:\n",
        "      validate_accuracy = sess.run(accuracy, feed_dict=validate_data)\n",
        "      print(\"after {} training steps, the loss is {}, the validation accuracy is {}\".format(\n",
        "          i, loss, validate_accuracy\n",
        "      ))\n",
        "      saver.save(sess, \"./model.ckpt\", global_step=i)\n",
        "\n",
        "  print(\"the training is finished!\")\n",
        "  # 最终的测试准确率\n",
        "  acc = sess.run(accuracy, feed_dict=test_data)\n",
        "  print(\"the test accuracy is:{}\".format(acc))"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "after 100 training steps, the loss is 0.3007691502571106, the validation accuracy is 0.8791999816894531\n",
            "after 200 training steps, the loss is 0.18718621134757996, the validation accuracy is 0.9085999727249146\n",
            "after 300 training steps, the loss is 0.23296503722667694, the validation accuracy is 0.9223999977111816\n",
            "after 400 training steps, the loss is 0.23762854933738708, the validation accuracy is 0.9215999841690063\n",
            "after 500 training steps, the loss is 0.3668045997619629, the validation accuracy is 0.9247999787330627\n",
            "after 600 training steps, the loss is 0.23218177258968353, the validation accuracy is 0.9394000172615051\n",
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow_core/python/training/saver.py:963: remove_checkpoint (from tensorflow.python.training.checkpoint_management) is deprecated and will be removed in a future version.\n",
            "Instructions for updating:\n",
            "Use standard file APIs to delete files with this prefix.\n",
            "after 700 training steps, the loss is 0.3196142911911011, the validation accuracy is 0.9466000199317932\n",
            "after 800 training steps, the loss is 0.30492380261421204, the validation accuracy is 0.9455999732017517\n",
            "after 900 training steps, the loss is 0.07111744582653046, the validation accuracy is 0.9508000016212463\n",
            "the training is finished!\n",
            "the test accuracy is:0.9503999948501587\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "FCITvhTCurIe",
        "colab_type": "text"
      },
      "source": [
        "下面，用我们训练的模型做一个测试。"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "nRaoxslHup5Y",
        "colab_type": "code",
        "outputId": "f1dece0c-4ca6-48be-959c-30e67c964650",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 535
        }
      },
      "source": [
        "with tf.Session() as sess:\n",
        "  ckpt = tf.train.get_checkpoint_state(\"./\")\n",
        "  if ckpt and ckpt.model_checkpoint_path:\n",
        "    saver.restore(sess, ckpt.model_checkpoint_path)\n",
        "    final_pred, acc = sess.run(\n",
        "        [pred, accuracy],\n",
        "        feed_dict={\n",
        "            x: mnist.test.images[:16],\n",
        "            y: mnist.test.labels[:16]\n",
        "        }\n",
        "    )\n",
        "    orders = np.argsort(final_pred)\n",
        "    plt.figure(figsize=(8, 8))\n",
        "    print(acc)\n",
        "    for idx in range(16):\n",
        "      order = orders[idx, :][-1]\n",
        "      prob = final_pred[idx, :][order]\n",
        "      plt.subplot(4, 4, idx + 1)\n",
        "      plt.axis(\"off\")\n",
        "      plt.title(\"{}: [{}]-[{:.1f}%]\".format(mnist.test.labels[idx], order, prob * 100))\n",
        "      plt.imshow(mnist.test.images[idx].reshape((28, 28)))\n",
        "  else:\n",
        "    pass"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "INFO:tensorflow:Restoring parameters from ./model.ckpt-900\n",
            "0.9375\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n273bQ9oOs2/7SOTYzJEn/pnA0qkwMo+yx9AfrP1GxLy7c73Hd1Z+77eE1elA5H9zEABsOGNvxLxd\nH7/OjeuuCO4WHP847rB334qYb+fX9uMoK2xakrA6HQgW3O5d/+C/HSxaU7u8Z00v/tXbDs9+5yYr\nrflDv7tx7t7Iv7HigGe6REREAWGjS0REFJADtnt5yx32024apnk3Htx03alunL5lZkLrkVbP65J6\ns7H9RJss5TFPsiw9O/rurnP/OtM3dWA8FScoK56paE3/dfgoNx623h4CavCm93aeIG/BWdWzght3\nz7BvYDloykA3bvwcnzqVn9T2ra3pH45/2jdVzo0e3WQP7czY6r1l6MMW9j7Sr7XvqYKv9X/JSnt0\n5BlunLv036jqmyzc6xMREQWEjS4REVFADqju5U1XHunGH3f8r5X29raD3Tj9h8R2KfvNv9+7ejNL\n7U6zgct6u3HO+g2B1YmAUw+bEzFtW+4eazpruPey9RR2LxeKqljT/m1g6qamVlrqnvVIlJRK9tON\nFj3U3o3Hnv6kG+ci3crXuN8fCavTgWbj4fbL6ZumeU99u2rFsW68sttOK19KBW8osMvV3hXst1z5\nkZWvfyXv93Gs/e4YfDlmuRvPP7V4P7mKZ7pEREQBYaNLREQUEDa6REREATmgxnRTztzoxvXTMqy0\nN9472Y0bIrGX/qd2aOPGo4/33lKSqfbL0Zc/6V1iXyEzcW83IiPzlMPc+PkGr0XMtzLktTYpP/0e\nPiPF5H9tx1rTl0/s5cbLd9Rz431v2E+CitbaY7y3QJ1yxGwr7Yv6L/qmvHHc7rMvsPJVw19F+u7S\nKMfe5SIX3v9/7isd3bg6frXz7drlxvWe8PbNH/U9zMp3YaWvvAm1b+1al+mN2evezOgrnQQ80yUi\nIgoIG10iIqKAlOju5dRatazpYa2/jpi34Yjgniaz8Jqqbtw1w7tF4oUt7a18FcawSzlI6w5LLzgT\ngL5f3WBNtwLXU1HVfq6cNT3hVe9ej17l7AfTv9F4ghunwLvVKPdJRVFYZSByGe/v8G4Jq3FndC9Y\np/1VOmdNxLRtJ3ldyNXfjK68e5p8ETIn8jniz7+3dePWW6ZF9wVJwjNdIiKigLDRJSIiCkiJ7l6W\n8vZjSU4qv82ND59+iZVWFwsCqRMA1Gy6Oez8d5d2tfNhcdh8lBhlDt0SMW3BPu+pOG2f3WilBfnw\n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\n",
            "text/plain": [
              "<Figure size 576x576 with 16 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "EulsmlTAw3qE",
        "colab_type": "text"
      },
      "source": [
        "以作业提供的参数运行出来的结果，只看上面几个数字还是很不错的，但是总体准确率不太理想。"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "XBRC5UqKsU9a",
        "colab_type": "text"
      },
      "source": [
        "心得体会：\n",
        "+ 模型结构：模型采用了单层神经网络，该层包含100个节点，采用了交叉熵损失函数和SGD优化器，采用了分批次训练的做法，每批次32个数据点，学习率为0.3，训练集用了55000个数据点，验证集用了5000个数据点，测试集用了10000个数据点；\n",
        "\n",
        "+ 模型训练过程：采用了SGD训练的思路，每批次使用32个数据点作为一个样本，这样可以省内存，进行了1000步的迭代，每次迭代时，采用交叉熵损失函数作为目标函数，再采用GradientDescentOptimizer作为优化器，逐步接近目标函数最小值。但从迭代过程中每一步的输出可以看到，目标函数并不是单调递减的，中间也有变大的情况，但总体趋势，仍然是变小的，但也可以看出这种训练过程的不稳定性，原因一可能是不同批次的数据不同，部分批次影响了该步的迭代结果，原因二可能是模型本身有局部极小值点，但随后又经过短暂上升后，再下降的过程，属于模型本身的特点。最终得到的预测结果，通过softmax的计算，得到每张图预测结果属于某个数字的概率，然后挑选概率最大的那个数字作为预测结果，并用概率值来衡量置信度。\n",
        "\n",
        "+ 计算图(graph): 在tensorflow的世界中，变量的定义和初始化是分开的，所有关于图变量的赋值和计算，都要通过tf.Session()的run来进行，而在之前定义的都属于张量(tensor)，在run的时候，想要将所有图变量进行集体初始化时，应使用tf.global_variables_initializer，然后feed_dict中包含的key名称，对应于前面定义的placeholder或其他命名的变量。计算图可以通过tf.train.Saver来保存任一训练过程中的快照，用于之后使用，其中一种使用方式是用每一个快照来对验证集进行预测，来查看模型效果的演化过程。\n",
        "\n",
        "+ 模型效果较差：原因一可能是模型只有单层，过于简单；原因二可能是模型选择的优化器或学习率不够符合数据特点，容易陷入局部极小值点；原因三可能是batchsize值不合理导致的。"
      ]
    }
  ]
}